import os


def shi_wu():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'orm_check.settings')
    import django
    django.setup()

    # 开启事务
    from django.db import transaction
    # 开启事务
    with transaction.atomic():  # atomic原子性
        # 在with代码块内书写的所有orm操作都是属于同一个事务
        pass


def cha_xun_you_hua():
    """
    orm语句的特点:
        惰性查询--如果你只是书写了orm语句 后面根本没有用到该语句查询出来的参数 那么orm语句不会执行
    :return:
    """
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'orm_check.settings')
    import django
    django.setup()
    from app01 import models
    # res = models.Book.objects.all()
    # print(res)
    # 获取书籍表中所有书的名字
    res = models.Book.objects.values('title')
    print(res)
    for d in res:
        print(d.get('title'))

    # 实现获取到的是一个数据对象 然后.title就能够拿到书名 并且没有其他字段
    res = models.Book.objects.only('title')
    print(res)  # <QuerySet [<Book: 三国演义爆款>, <Book: 论语爆款>, <Book: 聊斋爆款>, <Book: 老子爆款>]>
    for i in res:
        print(i.title)  # 点击only括号内的字段  不会走数据库
        print(i.price)  # 点击only括号内没有的字段  会重新走数据库查询而all不需要走了

    res = models.Book.objects.defer('title')
    print(res)  # <QuerySet [<Book: 三国演义爆款>, <Book: 论语爆款>, <Book: 聊斋爆款>, <Book: 老子爆款>]>
    for i in res:
        print(i.price)
    """
    defer与only刚好相反
        defer括号内放的字段不在查询来的对象里面 查询该字段需要重新走数据库
        而如果查询的是非括号内的字段 子不需要走数据库了
    """

    # select_related与prefetch_related 跟跨表操作有关
    res = models.Book.objects.all()
    for i in res:
        print(i.publish.name)  # 每循环一次就要走一次数据库查询

    res = models.Book.objects.select_related('publish')  # inner join select_related('外键字段(一对一,一对多)')
    print('res:', res)
    for i in res:
        print(i.publish.name)
    """
    select_related内部直接先将book与publish连接起来 然后一次性将达标里面的所有数据
    全部封装给查询出来的对象
        这个时候无论点击book表的数据还是publish的数据都无需走数据库查询了
    """

    res = models.Book.objects.prefetch_related('publish')  # 子查询
    for i in res:
        print(i.publish.name)

    """
    prefetch_related该方法内部其实是子查询
        将子查询查询出来的结果给你封装到对象中
    """


if __name__ == '__main__':
    # shi_wu()
    cha_xun_you_hua()